//
//  ZHLNewWorking.m
//  Collection和TableView 的嵌套
//
//  Created by dllo on 15/12/21.
//  Copyright © 2015年 蓝鸥科技. All rights reserved.
//

#import "ZHLNewWorking.h"
#import "AFNetworking.h"
#import <CommonCrypto/CommonCrypto.h>
#import "Reachability.h"
@implementation ZHLNewWorking
+(void)GetDataWithURL:(NSString *)urlStr dic:(NSDictionary *)dic sussess:(void (^)(id responseObject))response filed:(void (^)(NSError *error))err;
{
    //只支持xcode7.0 以上的版本 + AFNetworking3.0以上的版本使用
    //如果是xcode7.0 一下的版本继续使用AFHttpRequestOperationManger;
    
#warning 2.判断网络状态
    Reachability *reach = [Reachability reachabilityForInternetConnection];
    if ( 0 != reach.currentReachabilityStatus) { //判断网络状态(不等于0代表有网)
        
    AFHTTPSessionManager *man = [AFHTTPSessionManager manager];
    
    //有返回的数据类型,AFN不支持解析,我们需要设置一下,让AFN 支持解析
    [man.responseSerializer setAcceptableContentTypes:[NSSet setWithObjects:@"text/html", @"application/json", @"text/json", @"text/javascript",@"text/html",@"text/css", @"text/plain", @"application/x-javascript", @"application/javascript",nil]];
    
    [man GET:urlStr parameters:dic success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
        //返回数据
        response(responseObject);
        
#warning  1.开始做缓存
        //调用缓存路径方法,
        [self cachePath:urlStr response:responseObject type:0];
        
    } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
        
        err(error);
        
    }];
    }
    else{ //无网 走缓存
        //response 后面我们没有走网络请求,我不是要缓存数据而是要获得数据
        //拿到缓存路径
        id data = [self cachePath:urlStr response:nil type:1];
        
        if (data != nil) {//如果找到那个文件,则取值(写个保护)
           
            response(data);
        }
        
    }
}

    

    
#warning  1.开始做缓存
+(id )cachePath:(NSString *)urlStr response:(id)responseObject type:(NSInteger)type
{
    //1.把我们的网址利用MD5加密算法转换成数字和字符串的组合(因为网址不能直接作为文件名字)
    
    
    //如果self 后面调用的是减号方法那么self 就是本类的对象.例如 :Person *per = nil self就是per
    //如果self 后面调用的是+号方法,那么这个self就是本类的名字    Person就是self
    NSString *fileName = [self cachedFileNameForKey:urlStr];
    
    //2.找到cache文件夹在沙盒中的路径
    NSString *cachePath = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES).firstObject;
    
    //3.路径文件名拼接
    NSString *cacheP = [cachePath stringByAppendingPathComponent:fileName];
    
    //4.把网络请求成功的数据归档
    NSData *data = [NSKeyedArchiver archivedDataWithRootObject:responseObject];
    
    
    
    if (0 == type) {//如果type是0代表我要写入 1.读取
        
        //5. 写入本地
        [data writeToFile:cacheP atomically:YES];
        
        return nil;
        
    }else if(1 == type){
        //读取
        id data = [NSKeyedUnarchiver unarchiveObjectWithFile:cacheP];
        return data;
    }
    
    NSLog(@"%@",cacheP);
    return nil;
}



// 利用MD5算法把网址转换成一串数字加字母
+ (NSString *)cachedFileNameForKey:(NSString *)key {
    const char *str = [key UTF8String];
    if (str == NULL) {
        str = "";
    }
    unsigned char r[CC_MD5_DIGEST_LENGTH];
    CC_MD5(str, (CC_LONG)strlen(str), r);
    NSString *filename = [NSString stringWithFormat:@"%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x",
                          r[0], r[1], r[2], r[3], r[4], r[5], r[6], r[7], r[8], r[9], r[10], r[11], r[12], r[13], r[14], r[15]];
    return filename;
}


@end
